/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.be;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.cip.esymons.general.be.Capitulo;
import org.cip.esymons.tramite.be.CuentaingresoTramite;

/**
 *
 * @author Gilmar Montoya
 */
@Entity
@Table(name = "tes_cuenta_ingreso")
//@NamedQueries({@NamedQuery(name = "CuentaIngreso.findAll", query = "SELECT c FROM CuentaIngreso c"), @NamedQuery(name = "CuentaIngreso.findByCinCodigo", query = "SELECT c FROM CuentaIngreso c WHERE c.cinCodigo = :cinCodigo"), @NamedQuery(name = "CuentaIngreso.findByCinDesc", query = "SELECT c FROM CuentaIngreso c WHERE c.cinDesc = :cinDesc"), @NamedQuery(name = "CuentaIngreso.findByCinPorcentajecip", query = "SELECT c FROM CuentaIngreso c WHERE c.cinPorcentajecip = :cinPorcentajecip")})
public class CuentaIngreso implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "cin_codigo", nullable = false, length = 15)
    protected String cinCodigo;
    @Basic(optional = false)
    @Column(name = "cin_desc", nullable = false, length = 120)
    private String cinDesc;
    @Column(name = "cin_porcentajecip")
    private Double cinPorcentajecip;
    @Column(name = "cin_estado")
    private EnumEstadoCuentaIngreso estado;
    @Column(name = "cin_glosa")
    private String glosa;
    @Column(name = "cin_aplicable")
    private EnumAplicableCI aplicable;
    @Column(name = "cin_afectoaigv")
    private Boolean esAfectoIgv;
    @Column(name = "cin_pagoParcial")
    private boolean pagoParcial;
    @Column(name = "cin_aplicaDescuento")
    private boolean afectoDescuentoPagoAnual;
    @Column(name = "cin_verDireccionAcotacion")
    private boolean verDireccionAcotacion;
    @Column(name = "cin_tipoExoneracion")
    private EnumTipoDescuento tipoExoneracion;
    @Column(name = "cin_motivoAnulacion")
    private String motivo;
    @Column(name = "cin_tipo")
    private EnumTipoCuentaIngreso tipo;
    @Transient
    private boolean select;
    @JoinColumn(name = "fk_cap_codigo", referencedColumnName = "cap_codigo", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Capitulo fkCapCodigo;
    @JoinColumn(name = "fk_tmo_codigo", referencedColumnName = "tmo_codigo")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private TipoMoneda fkTmoCodigo;
    @JoinColumn(name = "fk_cco_codigo", referencedColumnName = "cco_codigo", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private CuentaContable fkCcoCodigo;
    @JoinColumn(name = "fk_cin_codigo", referencedColumnName = "cin_codigo")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private CuentaIngreso fkCinCodigoPadre;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkCinCodigoPadre", fetch = FetchType.LAZY)
    private List<CuentaIngreso> cuentaIngresoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkCinCodigo", fetch = FetchType.LAZY)
    private List<MovimientoCuenta> movimientoCuentaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkCinCodigo", fetch = FetchType.LAZY)
    private List<ValorCuenta> valorCuentaList;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "cuentaIngreso", fetch = FetchType.LAZY)
    private CuentaIngresoElectoral cuentaIngresoElectoral;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "cuentaIngreso", fetch = FetchType.LAZY)
    private CuentaingresoAmbiente cuentaingresoAmbiente;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "cuentaIngreso", fetch = FetchType.LAZY)
    private CuentaingresoEvento cuentaingresoEvento;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "cuentaIngreso", fetch = FetchType.LAZY)
    private CuentaingresoServicio cuentaingresoServicio;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cuentaIngreso", fetch = FetchType.LAZY)
    private List<DetPagoAgrupado> detPagoAgrupados;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkCinCodigo", fetch = FetchType.LAZY)
    private List<CuentaingresoTramite> listaCuentasIngresoTramite;
    @Transient
    private Double descuento;
    @Transient
    private Double porcentaje;

    public CuentaIngreso() {
    }

    public CuentaIngreso(String cinCodigo) {
        this.cinCodigo = cinCodigo;
    }

    public CuentaIngreso(String cinCodigo, String cinDesc) {
        this.cinCodigo = cinCodigo;
        this.cinDesc = cinDesc;
        this.glosa = cinDesc;
        afectoDescuentoPagoAnual = false;
    }

    public String getCinCodigo() {
        return cinCodigo;
    }

    public void setCinCodigo(String cinCodigo) {
        this.cinCodigo = cinCodigo;
    }

    public String getCinDesc() {
        return cinDesc;
    }

    public void setCinDesc(String cinDesc) {
        this.cinDesc = cinDesc;
    }

    public Double getCinPorcentajecip() {
        return cinPorcentajecip;
    }

    public void setCinPorcentajecip(Double cinPorcentajecip) {
        this.cinPorcentajecip = cinPorcentajecip;
    }

    public Capitulo getFkCapCodigo() {
        return fkCapCodigo;
    }

    public void setFkCapCodigo(Capitulo fkCapCodigo) {
        this.fkCapCodigo = fkCapCodigo;
    }

    public TipoMoneda getFkTmoCodigo() {
        return fkTmoCodigo;
    }

    public void setFkTmoCodigo(TipoMoneda fkTmoCodigo) {
        this.fkTmoCodigo = fkTmoCodigo;
    }

    public CuentaContable getFkCcoCodigo() {
        return fkCcoCodigo;
    }

    public void setFkCcoCodigo(CuentaContable fkCcoCodigo) {
        this.fkCcoCodigo = fkCcoCodigo;
    }

    public List<MovimientoCuenta> getMovimientoCuentaList() {
        return movimientoCuentaList;
    }

    public void setMovimientoCuentaList(List<MovimientoCuenta> movimientoCuentaList) {
        this.movimientoCuentaList = movimientoCuentaList;
    }

    public List<ValorCuenta> getValorCuentaList() {
        return valorCuentaList;
    }

    public void setValorCuentaList(List<ValorCuenta> valorCuentaList) {
        this.valorCuentaList = valorCuentaList;
    }

    
    public String getDatoAdicional() {
        try {
            if (this.cuentaIngresoElectoral != null) {
                return this.cuentaIngresoElectoral.getProcesoElectoral().getNombre();
            }
            if (this.cuentaingresoAmbiente != null) {
                return this.cuentaingresoAmbiente.getFkAmbCodigo().getAmbNombre();
            }
            if (this.cuentaingresoServicio != null) {
                return this.cuentaingresoServicio.getFkSerCodigo().getSerNombre();
            }
            if (this.cuentaingresoEvento != null) {
                return this.cuentaingresoEvento.getFkEveCodigo().getPreevento().getPreNombre();
            }
            return null;
        } catch (Exception ex) {
            return null;
        }
    }

    public String getNombreLargoCuentaIngreso() {
        try {
            return cinCodigo + "-" + glosa;
        } catch (Exception ex) {
            return "Error";
        }
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cinCodigo != null ? cinCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CuentaIngreso)) {
            return false;
        }
        CuentaIngreso other = (CuentaIngreso) object;
        if ((this.cinCodigo == null && other.cinCodigo != null) || (this.cinCodigo != null && !this.cinCodigo.equals(other.cinCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.cip.esymons.tesoreria.be.CuentaIngreso[cinCodigo=" + cinCodigo + "]";
    }

    /**
     * @return the fkCinCodigoPadre
     */
    public CuentaIngreso getFkCinCodigoPadre() {
        return fkCinCodigoPadre;
    }

    /**
     * @param fkCinCodigoPadre the fkCinCodigoPadre to set
     */
    public void setFkCinCodigoPadre(CuentaIngreso fkCinCodigoPadre) {
        this.fkCinCodigoPadre = fkCinCodigoPadre;
    }

    /**
     * @return the cuentaIngresoList
     */
    public List<CuentaIngreso> getCuentaIngresoList() {
        return cuentaIngresoList;
    }

    /**
     * @param cuentaIngresoList the cuentaIngresoList to set
     */
    public void setCuentaIngresoList(List<CuentaIngreso> cuentaIngresoList) {
        this.cuentaIngresoList = cuentaIngresoList;
    }

    /**
     * @return the estado
     */
    public EnumEstadoCuentaIngreso getEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(EnumEstadoCuentaIngreso estado) {
        this.estado = estado;
    }

    /**
     * @return the glosa
     */
    public String getGlosa() {
        return glosa;
    }

    /**
     * @param glosa the glosa to set
     */
    public void setGlosa(String glosa) {
        this.glosa = glosa;
    }

    /**
     * @return the esAfectoIgv
     */
    public Boolean getEsAfectoIgv() {
        return esAfectoIgv;
    }

    /**
     * @param esAfectoIgv the esAfectoIgv to set
     */
    public void setEsAfectoIgv(Boolean esAfectoIgv) {
        this.esAfectoIgv = esAfectoIgv;
    }
    /**
     * @return the aplicable
     */
    public EnumAplicableCI getAplicable() {
        return aplicable;
    }

    /**
     * @param aplicable the aplicable to set
     */
    public void setAplicable(EnumAplicableCI aplicable) {
        this.aplicable = aplicable;
    }    
    /**
     * @return the pagoParcial
     */
    public boolean isPagoParcial() {
        return pagoParcial;
    }

    /**
     * @param pagoParcial the pagoParcial to set
     */
    public void setPagoParcial(boolean pagoParcial) {
        this.pagoParcial = pagoParcial;
    }

    /**
     * @return the tipo
     */
    public EnumTipoCuentaIngreso getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(EnumTipoCuentaIngreso tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the cuentaIngresoElectoral
     */
    public CuentaIngresoElectoral getCuentaIngresoElectoral() {
        return cuentaIngresoElectoral;
    }

    /**
     * @param cuentaIngresoElectoral the cuentaIngresoElectoral to set
     */
    public void setCuentaIngresoElectoral(CuentaIngresoElectoral cuentaIngresoElectoral) {
        this.cuentaIngresoElectoral = cuentaIngresoElectoral;
    }

    /**
     * @return the cuentaingresoAmbiente
     */
    public CuentaingresoAmbiente getCuentaingresoAmbiente() {
        return cuentaingresoAmbiente;
    }

    /**
     * @param cuentaingresoAmbiente the cuentaingresoAmbiente to set
     */
    public void setCuentaingresoAmbiente(CuentaingresoAmbiente cuentaingresoAmbiente) {
        this.cuentaingresoAmbiente = cuentaingresoAmbiente;
    }

    /**
     * @return the cuentaingresoEvento
     */
    public CuentaingresoEvento getCuentaingresoEvento() {
        return cuentaingresoEvento;
    }

    /**
     * @param cuentaingresoEvento the cuentaingresoEvento to set
     */
    public void setCuentaingresoEvento(CuentaingresoEvento cuentaingresoEvento) {
        this.cuentaingresoEvento = cuentaingresoEvento;
    }

    /**
     * @return the cuentaingresoServicio
     */
    public CuentaingresoServicio getCuentaingresoServicio() {
        return cuentaingresoServicio;
    }

    /**
     * @param cuentaingresoServicio the cuentaingresoServicio to set
     */
    public void setCuentaingresoServicio(CuentaingresoServicio cuentaingresoServicio) {
        this.cuentaingresoServicio = cuentaingresoServicio;
    }

    /**
     * @return the tipoExoneracion
     */
    public EnumTipoDescuento getTipoExoneracion() {
        return tipoExoneracion;
    }

    /**
     * @param tipoExoneracion the tipoExoneracion to set
     */
    public void setTipoExoneracion(EnumTipoDescuento tipoExoneracion) {
        this.tipoExoneracion = tipoExoneracion;
    }  

    /**
     * @return the afectoDescuentoPagoAnual
     */
    public boolean isAfectoDescuentoPagoAnual() {
        return afectoDescuentoPagoAnual;
    }

    /**
     * @param afectoDescuentoPagoAnual the afectoDescuentoPagoAnual to set
     */
    public void setAfectoDescuentoPagoAnual(boolean afectoDescuento) {
        this.afectoDescuentoPagoAnual = afectoDescuento;
    }

    /**
     * @return the verDireccionAcotacion
     */
    public boolean isVerDireccionAcotacion() {
        return verDireccionAcotacion;
    }

    /**
     * @param verDireccionAcotacion the verDireccionAcotacion to set
     */
    public void setVerDireccionAcotacion(boolean verDireccionAcotacion) {
        this.verDireccionAcotacion = verDireccionAcotacion;
    }

    /**
     * @return the detPagoAgrupados
     */
    public List<DetPagoAgrupado> getDetPagoAgrupados() {
        return detPagoAgrupados;
    }

    /**
     * @param detPagoAgrupados the detPagoAgrupados to set
     */
    public void setDetPagoAgrupados(List<DetPagoAgrupado> detPagoAgrupados) {
        this.detPagoAgrupados = detPagoAgrupados;
    }

    /**
     * @return the descuento
     */
    public Double getDescuento() {
        return descuento;
    }

    /**
     * @param descuento the descuento to set
     */
    public void setDescuento(Double descuento) {
        this.descuento = descuento;
    }

    /**
     * @return the porcentaje
     */
    public Double getPorcentaje() {
        return porcentaje;
    }

    /**
     * @param porcentaje the porcentaje to set
     */
    public void setPorcentaje(Double porcentaje) {
        this.porcentaje = porcentaje;
    }

    /**
     * @return the motivo
     */
    public String getMotivo() {
        return motivo;
    }

    /**
     * @param motivo the motivo to set
     */
    public void setMotivo(String motivo) {
        this.motivo = motivo;
    }

    /**
     * @return the listaCuentasIngresoTramite
     */
    public List<CuentaingresoTramite> getListaCuentasIngresoTramite() {
        return listaCuentasIngresoTramite;
    }

    /**
     * @param listaCuentasIngresoTramite the listaCuentasIngresoTramite to set
     */
    public void setListaCuentasIngresoTramite(List<CuentaingresoTramite> listaCuentasIngresoTramite) {
        this.listaCuentasIngresoTramite = listaCuentasIngresoTramite;
    }

    public boolean getSelect() {
        return select;
    }

    public void setSelect(boolean select) {
        this.select = select;
    }
}
